CLIQUE(CLustering In QUEst)是一種基於密度的子空間聚類演算法,特別適合於處理高維數據。CLIQUE 的獨特之處在於,它不僅能夠發現數據的聚類結構,還能識別高維數據集中具有意義的子空間,這對於理解複雜數據中的模式非常有用。
子空間聚類: 高維數據集中,某些維度可能不對聚類有太大影響,CLIQUE 會自動發現那些對聚類有顯著影響的子空間,並在這些子空間內進行聚類。
密度網格: CLIQUE 將數據空間劃分為若干個小的網格單元(grid cells),然後計算每個單元的密度。如果一個單元的密度超過了預設的閾值,則認為該單元是稠密的,並將其標記為可能包含聚類的部分。
稠密區域合併: 連續的稠密單元會被合併為一個更大的聚類區域。這樣,CLIQUE 可以發現不規則形狀的聚類,而不是僅限於球形或凸形聚類。
演算法步驟:
from sklearn.datasets import load_iris
import pandas as pd
import numpy as np
from collections import defaultdict
iris = load_iris()
X = iris.data
df = pd.DataFrame(X, columns=iris.feature_names)
grid_size = 10
grid = []
for i in range(X.shape[1]):
min_val = np.min(X[:, i])
max_val = np.max(X[:, i])
grid.append(np.linspace(min_val, max_val, grid_size))
grid_cells = np.array([np.digitize(X[:, i], grid[i]) for i in range(X.shape[1])]).T
cell_density = defaultdict(int)
for cell in grid_cells:
cell_density[tuple(cell)] += 1
density_threshold = 10
dense_cells = {cell for cell, count in cell_density.items() if count >= density_threshold}
clusters = []
visited = set()
for cell in dense_cells:
if cell not in visited:
cluster = set()
stack = [cell]
while stack:
current = stack.pop()
if current not in visited:
visited.add(current)
cluster.add(current)
neighbors = [tuple(np.array(current) + np.array(offset))
for offset in np.identity(len(current), dtype=int)]
for neighbor in neighbors:
if neighbor in dense_cells:
stack.append(neighbor)
clusters.append(cluster)
由於 CLIQUE 是專門用於高維數據的,因此對於像鳶尾花數據集這樣的低維數據,它的優勢可能不如在高維數據中的表現那麼明顯。不過,這個示例依然展示了如何將這種基於密度的子空間聚類方法應用於實際數據分析中。